/**
 * 节点工具
 * @see NodeUtil.ts 
 */
export default class NodeUtil {

    /**
     * 获取节点在目标节点（容器）下的相对位置
     * @param node 节点
     * @param container 目标节点（容器）
     */
    public static getRelativePosition(node: cc.Node, container: cc.Node): cc.Vec2 {
        const worldPos = (node.getParent() || node).convertToWorldSpaceAR(node.getPosition());
        return container.convertToNodeSpaceAR(worldPos);
    }

    /**
     * 坐标是否在目标节点范围内
     * @param pos 坐标
     * @param target 目标节点
     */
    public static isPosOnNodeRect(pos: cc.Vec2, target: cc.Node): boolean {
        const rect = target.getBoundingBoxToWorld();
        return rect.contains(pos);
    }

    /**
     * 两个节点是否重叠
     * @param node1 节点 1
     * @param node2 节点 2
     * @param contains 是否完全包含
     */
    public static areNodesOverlap(node1: cc.Node, node2: cc.Node, contains: boolean = false): boolean {
        const rect2 = node2.getBoundingBoxToWorld();
        const rect1 = node1.getBoundingBoxToWorld();
        return contains ? rect2.containsRect(rect1) : rect2.intersects(rect1);
    }

    /**
     * 先根遍历节点树, 查找特定子节点(第一个找到的)
     * @param {cc.Node} ele 根节点
     * @param {String} name 子节点名称
     * @param {component} component 子节点组件名称
     * @returns {cc.Node | null} child
     */
    public static getChildByName(ele: cc.Node, name: string,component?:any) {
        if (ele.name === name) {
            // 先访问根节点, 若找到则返回该节点
            if(component) return ele.getComponent(component);
            return ele;
        }
        // 否则按从左到右的顺序遍历根节点的每一棵子树
        for (let i = 0; i < ele.children.length; i++) {
            if (this.getChildByName(ele.children[i], name, component)) {
                // 若找到则返回该节点
                return this.getChildByName(ele.children[i], name, component);
            };
        }
        // 找不到返回 null
        return null;
    }

}
